ECMAScript 2021 (ES12) এবং ECMAScript 2022 (ES13) জাভাস্ক্রিপ্টের দুটি গুরুত্বপূর্ণ আপডেট যা ২০২১ এবং ২০২২ সালে প্রকাশিত হয়েছিল। এই আপডেটগুলো জাভাস্ক্রিপ্টের ভাষাকে আরও শক্তিশালী, নমনীয় এবং কার্যকর করে তোলে, ডেভেলপারদের জন্য নতুন ফিচার এবং উন্নত বৈশিষ্ট্য নিয়ে আসে। নিচে ES12 এবং ES13 এর প্রধান বৈশিষ্ট্যসমূহ বিস্তারিতভাবে আলোচনা করা হলো।
&&=
, ||=
, ??=
)Logical Assignment Operators হলো লজিক্যাল অপারেটর এবং অ্যাসাইনমেন্ট অপারেটরকে একসাথে মিশ্রিত করার একটি নতুন পদ্ধতি। এগুলো কোডের সংক্ষিপ্ততা এবং পাঠযোগ্যতা বৃদ্ধি করে।
let a = 1;
let b = 0;
let c = null;
a &&= 2; // a = a && 2; => a = 2
b ||= 2; // b = b || 2; => b = 2
c ??= 2; // c = c ?? 2; => c = 2
console.log(a, b, c); // আউটপুট: 2 2 2
ব্যাখ্যা:
&&=
অপারেটরটি ডানদিকের মানকে প্রয়োগ করে যদি বামদিকের মান সত্যি হয়।||=
অপারেটরটি ডানদিকের মানকে প্রয়োগ করে যদি বামদিকের মান মিথ্যা হয়।??=
অপারেটরটি ডানদিকের মানকে প্রয়োগ করে যদি বামদিকের মান null
বা undefined
হয়।Numeric Separators হলো বড় সংখ্যাগুলিকে পড়তে সহজ করার জন্য ব্যবহৃত একটি ফিচার, যেখানে আন্ডারস্কোর (_
) ব্যবহার করে সংখ্যার বিভিন্ন অংশ আলাদা করা হয়।
const billion = 1_000_000_000;
const bytes = 1_024;
const hex = 0xFF_FF_FF;
console.log(billion); // আউটপুট: 1000000000
console.log(bytes); // আউটপুট: 1024
console.log(hex); // আউটপুট: 16777215
ব্যাখ্যা: আন্ডারস্কোর ব্যবহার করে বড় সংখ্যাগুলিকে ভিজ্যুয়ালি বিভক্ত করা হয়, যা কোডের পাঠযোগ্যতা বৃদ্ধি করে।
Promise.any()
হলো একটি নতুন প্রমিস মেথড যা একাধিক প্রমিসের মধ্যে যেকোনো একটি সফল হলে তা রিটার্ন করে। যদি সব প্রমিস ব্যর্থ হয়, তবে এটি একটি AggregateError
রিটার্ন করে।
const promise1 = Promise.reject("Error 1");
const promise2 = Promise.resolve("Success 2");
const promise3 = Promise.resolve("Success 3");
Promise.any([promise1, promise2, promise3])
.then(result => console.log(result)) // আউটপুট: Success 2
.catch(error => console.error(error));
ব্যাখ্যা: Promise.any()
প্রথম সফল প্রমিসের মান রিটার্ন করে এবং সব প্রমিস ব্যর্থ হলে একটি AggregateError
প্রদান করে।
WeakRefs হলো জাভাস্ক্রিপ্টে একটি নতুন রেফারেন্স টাইপ যা গার্বেজ কালেকশন দ্বারা অবজেক্ট রিফারেন্স করতে পারে না। এটি মেমোরি ব্যবস্থাপনায় সহায়ক।
let obj = { name: "Alice" };
let weakRef = new WeakRef(obj);
console.log(weakRef.deref()); // আউটপুট: { name: "Alice" }
obj = null; // অবজেক্ট রিলিজ করা হল
console.log(weakRef.deref()); // আউটপুট: undefined (গার্বেজ কালেকশন দ্বারা মুছে ফেলা হয়েছে)
ব্যাখ্যা: WeakRef
ব্যবহার করে অবজেক্টের উপর একটি দুর্বল রেফারেন্স তৈরি করা হয়, যা গার্বেজ কালেকশন দ্বারা মুছে ফেলা যেতে পারে।
replaceAll()
মেথডটি একটি স্ট্রিংয়ের সব ম্যাচিং সাবস্ট্রিংকে প্রতিস্থাপন করে। এটি পূর্বের replace()
এর তুলনায় আরও সহজ ও কার্যকর।
const str = "Hello Hello World";
const newStr = str.replaceAll("Hello", "Hi");
console.log(newStr); // আউটপুট: Hi Hi World
ব্যাখ্যা: replaceAll()
মেথডটি স্ট্রিংয়ের সব "Hello" শব্দকে "Hi" তে পরিবর্তন করে।
AggregateError
হলো একটি নতুন এ্যারর টাইপ যা একাধিক এ্যারর ধারণ করতে পারে। এটি মূলত Promise.any()
এর সাথে ব্যবহার করা হয়।
const promise1 = Promise.reject("Error 1");
const promise2 = Promise.reject("Error 2");
Promise.any([promise1, promise2])
.then(result => console.log(result))
.catch(error => {
console.error(error.name); // আউটপুট: AggregateError
console.error(error.errors); // আউটপুট: ["Error 1", "Error 2"]
});
ব্যাখ্যা: যদি Promise.any()
এর সব প্রমিস ব্যর্থ হয়, তবে একটি AggregateError
রিটার্ন হয় যা সব ব্যর্থ এ্যারর ধারণ করে।
Top-level await মডিউল লেভেলে অ্যাসিঙ্ক্রোনাস অপারেশনগুলি সোজাসুজি await
ব্যবহার করে পরিচালনা করার সুবিধা প্রদান করে। এটি কোডকে আরও সহজ এবং রিডেবল করে তোলে।
// module.mjs
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
ব্যাখ্যা: await
কিওয়ার্ডটি সরাসরি মডিউলের ভিতরে ব্যবহার করা যায়, যা অ্যাসিঙ্ক্রোনাস অপারেশনগুলোকে সহজ করে তোলে।
Class Fields এবং Private Methods ক্লাসে প্রাইভেট এবং পাবলিক প্রপার্টি ডিফাইন করার জন্য ব্যবহৃত হয়। এটি অবজেক্ট-অরিয়েন্টেড প্রোগ্রামিংকে আরও সহজ এবং নিরাপদ করে তোলে।
class Rectangle {
width = 0;
height = 0;
#privateField = "secret";
constructor(width, height) {
this.width = width;
this.height = height;
}
area() {
return this.width * this.height;
}
getPrivate() {
return this.#privateField;
}
}
const rect = new Rectangle(5, 10);
console.log(rect.area()); // আউটপুট: 50
console.log(rect.getPrivate()); // আউটপুট: secret
console.log(rect.#privateField); // SyntaxError: Private field '#privateField' must be declared in an enclosing class
ব্যাখ্যা: #privateField
একটি প্রাইভেট প্রপার্টি যা শুধুমাত্র ক্লাসের ভিতরে অ্যাক্সেসযোগ্য।
Top-level await ES13 এ উন্নত করা হয়েছে, যা মডিউল লেভেলে অ্যাসিঙ্ক্রোনাস কোড লেখাকে আরও সহজ করে তোলে।
// module.mjs
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
ব্যাখ্যা: ES13 এ await
কিওয়ার্ডটি মডিউলের সরাসরি লেভেলে ব্যবহার করা যায়, যা অ্যাসিঙ্ক্রোনাস অপারেশনগুলোকে আরও সহজ এবং রিডেবল করে তোলে।
Ergonomic Brand Checks হলো প্রাইভেট ফিল্ডগুলির অস্তিত্ব চেক করার জন্য একটি নতুন সুবিধা, যা প্রাইভেট ফিল্ডগুলির নিরাপত্তা বাড়ায়।
class MyClass {
#privateField;
constructor() {
this.#privateField = 42;
}
isPrivateField(value) {
return MyClass.#hasPrivateField(this, value);
}
static #hasPrivateField(obj, value) {
return obj.#privateField === value;
}
}
const obj = new MyClass();
console.log(obj.isPrivateField(42)); // আউটপুট: true
ব্যাখ্যা: এই ফিচারটি ক্লাসের মধ্যে প্রাইভেট ফিল্ডের অস্তিত্ব চেক করার সুবিধা প্রদান করে, যা কোডের নিরাপত্তা এবং রিডেবিলিটি উন্নত করে।
RegExp Match Indices হলো একটি নতুন ফিচার যা রেগুলার এক্সপ্রেশনের ম্যাচের সূচকগুলি প্রদান করে, যা স্ট্রিং ম্যানিপুলেশনে সহায়ক।
const regex = /(foo)(bar)/d;
const str = "foobar";
const match = regex.exec(str);
if (match) {
console.log(match.indices);
/*
আউটপুট:
[
[0, 6], // পুরো ম্যাচের সূচক
[0, 3], // 'foo' এর সূচক
[3, 6] // 'bar' এর সূচক
]
*/
}
ব্যাখ্যা: match.indices
প্রপার্টিটি প্রতিটি ক্যাপচার গ্রুপের সূচক প্রদান করে, যা স্ট্রিং প্রসেসিংকে আরও শক্তিশালী করে তোলে।
Error Cause হলো একটি নতুন ফিচার যা এ্যারর অবজেক্টে একটি কজ (cause) প্রদান করার সুবিধা দেয়, যা এ্যাররের মূল কারণ বুঝতে সহায়ক।
try {
throw new Error("Initial error");
} catch (err) {
throw new Error("Secondary error", { cause: err });
}
try {
// Outer try-catch
} catch (error) {
console.error(error.message); // আউটপুট: Secondary error
console.error(error.cause); // আউটপুট: Initial error
}
ব্যাখ্যা: cause
প্রপার্টিটি ব্যবহার করে একটি এ্যাররে অন্য একটি এ্যাররের কারণ হিসাবে যোগ করা যায়, যা ডিবাগিং এবং এ্যারর ম্যানেজমেন্টকে সহজ করে।
Array.prototype.at()
হলো একটি নতুন মেথড যা অ্যারের নির্দিষ্ট সূচকে অবস্থিত উপাদান অ্যাক্সেস করার সহজ পদ্ধতি প্রদান করে। এটি নেতিবাচক সূচকগুলিও সমর্থন করে, যা অ্যারের শেষ থেকে উপাদান অ্যাক্সেস করতে ব্যবহৃত হয়।
const array = [10, 20, 30, 40, 50];
console.log(array.at(2)); // আউটপুট: 30
console.log(array.at(-1)); // আউটপুট: 50
console.log(array.at(-3)); // আউটপুট: 30
ব্যাখ্যা: at()
মেথডটি সহজে নির্দিষ্ট বা নেতিবাচক সূচকে উপাদান অ্যাক্সেস করতে দেয়, যা array[array.length - 1]
এর পরিবর্তে আরও সংক্ষিপ্ত পদ্ধতি প্রদান করে।
Object.hasOwn()
হলো একটি নতুন মেথড যা অবজেক্টের নিজস্ব প্রপার্টি আছে কিনা তা চেক করে, যা Object.prototype.hasOwnProperty()
এর তুলনায় আরও সংক্ষিপ্ত এবং নিরাপদ পদ্ধতি প্রদান করে।
const obj = { a: 1, b: 2 };
console.log(Object.hasOwn(obj, 'a')); // আউটপুট: true
console.log(Object.hasOwn(obj, 'c')); // আউটপুট: false
ব্যাখ্যা: Object.hasOwn()
মেথডটি সরাসরি প্রপার্টির অস্তিত্ব চেক করে এবং এটি নোটিফিকেশন এড়ানোর জন্য সিকিউর থাকে।
Promise.any()
এবং for-await-of
লুপের মাধ্যমে অ্যাসিঙ্ক্রোনাস কোড লেখা আরও সহজ এবং কার্যকরী হয়।BigInt
এর মাধ্যমে বড় সংখ্যাগুলোকে সঠিকভাবে হ্যান্ডেল করা সম্ভব হয়েছে।Error Cause
এর মাধ্যমে এ্যারর ম্যানেজমেন্ট আরও কার্যকরী ও তথ্যবহুল হয়েছে।BigInt
এর মাধ্যমে বড় সংখ্যাগুলো সঠিকভাবে হ্যান্ডেল করা যায়, যা আর্থিক হিসাব বা অন্যান্য উচ্চ পরিসরের গণনার ক্ষেত্রে প্রয়োজনীয়।Class Fields
এবং Private Methods
ডেভেলপারদের অবজেক্ট-অরিয়েন্টেড প্রোগ্রামিংকে আরও সহজ এবং নিরাপদ করে তোলে।for-await-of
, async/await
, এবং Promise.allSettled()
এর মাধ্যমে অ্যাসিঙ্ক্রোনাস কোড লেখা আরও সহজ এবং রিডেবল হয়।Array.prototype.flat()
, Array.prototype.flatMap()
, Object.fromEntries()
, এবং Object.hasOwn()
মেথডগুলো ডেটা হ্যান্ডলিংকে আরও কার্যকরী করে তোলে।trimStart()
, trimEnd()
, এবং String.prototype.matchAll()
মেথডগুলো স্ট্রিং প্রসেসিংকে আরও সহজ করে তোলে।globalThis
ব্যবহার করে গ্লোবাল অবজেক্ট অ্যাক্সেস করা সহজ এবং পরিবেশ নির্বিশেষে একসাথে কাজ করে।ECMAScript 2021 (ES12) এবং ECMAScript 2022 (ES13) জাভাস্ক্রিপ্টের ভাষাকে আরও শক্তিশালী এবং কার্যকর করে তোলে। Logical Assignment Operators, Numeric Separators, Promise.any()
, BigInt
, for-await-of
লুপ, এবং String.prototype.replaceAll()
এর মতো ফিচারগুলো ডেভেলপারদের কোড লেখাকে আরও সহজ, সংক্ষিপ্ত এবং কার্যকর করে তোলে। ES13 এ ক্লাস প্রপার্টি উন্নতি, Array.prototype.at()
, Object.hasOwn()
, এবং Symbol.prototype.description
এর মতো নতুন বৈশিষ্ট্যগুলো জাভাস্ক্রিপ্টকে আরও নমনীয় এবং শক্তিশালী করে তোলে।
এই নতুন বৈশিষ্ট্যগুলো শেখা এবং ব্যবহার করা ডেভেলপারদের কোডের গুণগত মান এবং কার্যকারিতা বৃদ্ধি করতে সহায়ক, যা বড় এবং জটিল প্রজেক্টগুলির ক্ষেত্রে বিশেষভাবে উপকারী।
BigInt
, Array.prototype.flat()
, Object.fromEntries()
, Promise.prototype.finally()
, Object.hasOwn()
ইত্যাদি মেথডগুলো ব্যবহার করে বিভিন্ন উদাহরণ তৈরি করুন।for-await-of
এবং async/await
ব্যবহার করে অ্যাসিঙ্ক্রোনাস ফাংশনগুলো লিখে দেখুন এবং তাদের কার্যকারিতা বুঝুন।Class Fields
এবং Private Methods
ব্যবহার করে ক্লাস ডেভেলপমেন্ট অনুশীলন করুন।trimStart()
, trimEnd()
, এবং String.prototype.matchAll()
মেথডগুলো স্ট্রিং ম্যানিপুলেশনে ব্যবহার করে বিভিন্ন উদাহরণ তৈরি করুন।Error Cause
এর মাধ্যমে এ্যারর ম্যানেজমেন্ট উন্নত করুন, যা ডিবাগিং এবং এ্যারর ট্র্যাকিংকে সহজ করে।ES12 এবং ES13 এর নতুন বৈশিষ্ট্যগুলোকে ভালোভাবে বুঝে এবং প্রয়োগ করে আপনি আপনার জাভাস্ক্রিপ্ট প্রোগ্রামিং দক্ষতাকে আরও উন্নত এবং কার্যকরী করতে পারবেন, যা আপনার কোডকে আরও নির্ভরযোগ্য এবং শক্তিশালী করে তুলবে।
Read more